perm filename LC4G[206,LSP] blob sn#071152 filedate 1973-11-08 generic text, type T, neo UTF8
00100	FEXPR COMPL FILE ← BEGIN SCALAR Z;
00200		EVAL('OUTPUT . ('DSK!: . LIST (CAR FILE . 'LAP)))$
00300		EVAL('INPUT . ('DSK!: . FILE))$
00400		INC('T ,NIL)$
00500		OUTC(T,NIL)$
00600	LOOP:	Z ← ERRSET(READ())$
00700		IF ATOM Z THEN GO TO DONE$
00800		Z ← CAR Z$
00900		IF CAR Z EQ 'DE THEN
01000	BEGIN SCALAR PROG;
01100		PROG ← COMP(CADR Z,CADDR Z,CADDDR Z)$
01200		MAPC(FUNCTION(PRINT),PROG)$
01300		OUTC(NIL,NIL)$
01400		PRINT LIST(CADR Z,LENGTH PROG)$
01500		OUTC(T,NIL)$
01600	END
01700		ELSE PRINT Z$
01800		GO TO LOOP$
01900	DONE:	OUTC(NIL,T)$
02000		INC(NIL,T)$
02100		RETURN 'ENDCOMP END;
02200	
02300	COMP(FN,VARS,EXP) ←
02400		(LAMBDA VPR,N;
02500			APPEND(
02600				LIST LIST('LAP,FN,'SUBR ),
02700				MKPUSH(N,1),
02800				COMPEXP(EXP,-N,VPR),
02900				SUBSTACK N,
03000				'((POPJ P) NIL)))
03100		(PRUP(VARS,1),LENGTH VARS);
03200	
03300	SUBSTACK N ← IF N=0 THEN NIL
03400		ELSE LIST LIST('SUB ,'P ,LIST('C ,0,0,N,N));
03500	
03600	PRUP(VARS,N) ← IF NULL VARS THEN NIL
03700			ELSE (CAR VARS . N) . PRUP(CDR VARS,N+1);
03800	
03900	MKPUSH(N,M) ← IF N<M THEN NIL ELSE LIST('PUSH ,'P ,M).MKPUSH(N,M+1);
04000	
04100	COMPEXP(EXP,M,VPR) ←
04200		IF NULL EXP THEN '((MOVEI 1 0))
04300		ELSE IF EXP EQ 'T OR NUMBERP EXP THEN
04350			LIST LIST('MOVEI, 1, (LIST('QUOTE, EXP)))
04400		ELSE IF ATOM EXP THEN
04500			LIST LIST('MOVE ,1,M+CDR ASSOC(EXP,VPR),'P )
04600		ELSE IF CAR EXP EQ 'CAR THEN
04700			(IF ATOM CADR EXP THEN
04800				LIST LIST('HLRZ!@ ,1,
04900				  M+CDR ASSOC(CADR EXP,VPR),'P )
05000				ELSE APPEND(COMPEXP(CADR EXP,M,VPR),
05100				'((HLRZ!@ 1 1))))
05200		ELSE IF CAR EXP EQ 'CDR THEN
05300			(IF ATOM CADR EXP THEN
05400				LIST LIST('HRRZ!@ ,1,
05500				  M+CDR ASSOC(CADR EXP,VPR),'P )
05600				ELSE APPEND(COMPEXP(CADR EXP,M,VPR),
05700				'((HRRZ!@ 1 1))))
05800		ELSE IF CAR EXP EQ 'AND OR CAR EXP EQ 'OR OR
05900				CAR EXP EQ 'NOT OR CAR EXP EQ 'EQ THEN
06000			(LAMBDA L1,L2; APPEND(
06100					COMBOOL(EXP,M,L1,NIL,VPR),
06200				LIST('(MOVEI 1 (QUOTE T)),LIST('JRST ,0,L2),
06300				L1,'(MOVEI 1 0),L2)))
06400			(GENSYM1(),GENSYM1())
06500		ELSE IF CAR EXP EQ 'COND THEN
06600			COMCOND(CDR EXP,M,GENSYM1(),VPR)
06700		ELSE IF CAR EXP EQ 'QUOTE THEN LIST LIST('MOVEI,1,EXP)
06800		ELSE IF ATOM CAR EXP THEN
06900			APPEND(COMPLISA(CDR EXP,M,VPR),
07000				LIST LIST('CALL ,LENGTH CDR EXP,
07100					LIST('E ,CAR EXP)))
07200		ELSE IF CAAR EXP EQ 'LAMBDA THEN
07300			(LAMBDA N; APPEND(STACKUP(CDR EXP,M,VPR),
07400				COMPEXP(CADDAR EXP,M-N,
07500				APPEND(PRUP(CADAR EXP,1-M),VPR)),
07600				SUBSTACK N))
07700			LENGTH CDR EXP;
07800	
07900	STACKUP(U,M,VPR) ← IF NULL U THEN NIL
08000			ELSE APPEND(COMPEXP(CAR U,M,VPR),
08100				'((PUSH P 1)),
08200					STACKUP(CDR U,M-1,VPR));
08300	
08400	
08500	CCCHAIN EXP ← (CAR EXP EQ 'CAR OR CAR EXP EQ 'CDR) AND
08600			(ATOM CADR EXP OR CCCHAIN CADR EXP);
08700	
08800	COMPC(EXP,N2,M,VPR) ←
08900		IF ATOM EXP THEN ERROR 'COMPC 
09000		ELSE IF CAR EXP EQ 'CAR THEN
09100			(IF ATOM CADR EXP THEN
09200			LIST LIST('HLRZ!@ ,N2,M+CDR ASSOC(CADR EXP,VPR),'P )
09300			ELSE LIST('HLRZ!@ ,N2,N2).COMPC(CADR EXP,N2,M,VPR))
09400		ELSE IF ATOM CADR EXP THEN
09500			LIST LIST('HRRZ!@ ,N2,M+CDR ASSOC(CADR EXP,VPR),'P )
09600			ELSE LIST('HRRZ!@ ,N2,N2).COMPC(CADR EXP,N2,M,VPR);
09700	
09800	COMCOND(U,M,L,VPR) ←
09900		IF NULL U THEN LIST L
10000		ELSE IF NOT ATOM CAAR U AND CAAAR U EQ 'NULL AND NULL CADAR U THEN
10100			APPEND(COMPEXP(CADAAR U,M,VPR),
10200				LIST LIST('JUMPE ,1,L),
10300				COMCOND(CDR U,M,L,VPR))
10400		ELSE IF CAAR U EQ 'T THEN
10500			APPEND( COMPEXP(CADAR U,M,VPR),LIST L)
10600		ELSE (LAMBDA L1; APPEND(
10700			COMBOOL(CAAR U,M,L1,NIL,VPR),
10800			COMPEXP(CADAR U,M,VPR),
10900			LIST(LIST('JRST ,0,L),L1),
11000			COMCOND(CDR U,M,L,VPR)))
11100		GENSYM1();
11200	
11300	
11400	COMPLISA(U,M,VPR) ←
11500		(LAMBDA Z; APPEND(
11600			COMPLIS(Z,M,1,VPR),
11700			LOADAC(Z,1-CCOUNT Z,1,M-CCOUNT Z,VPR),
11800			SUBSTACK CCOUNT Z))
11900		CLASSIFY U;
12000	
12100	CCOUNT Z ← IF NULL Z THEN 0 ELSE IF CAAR Z = 4 THEN 1+CCOUNT CDR Z
12200		ELSE CCOUNT CDR Z;
12300	
12400	LOADAC(Z,M2,N2,M,VPR) ←
12500		IF NULL Z THEN NIL
12600		ELSE IF CAAR Z = 1 THEN
12700			LIST('MOVE ,N2,M+CDR ASSOC(CDAR Z,VPR),'P )
12800				.LOADAC(CDR Z,M2,N2+1,M,VPR)
12830		ELSE IF CAAR Z = 0 THEN
12860			LIST('MOVEI, N2, (LIST('QUOTE, CDAR Z)))
12890				.LOADAC(CDR Z, M2, N2+1, M, VPR)
12900		ELSE IF CAAR Z = 2 THEN
13000			LIST('MOVEI ,N2,CDAR Z)
13100				.LOADAC(CDR Z,M2,N2+1,M,VPR)
13200		ELSE IF CAAR Z =3 THEN
13300			APPEND(REVERSE COMPC(CDAR Z,N2,M,VPR),
13400				LOADAC(CDR Z,M2,N2+1,M,VPR))
13500		ELSE IF CAAR Z = 5 THEN LOADAC(CDR Z, 1, N2+1, M, VPR)
13600		ELSE LIST('MOVE ,N2,M2,'P ).
13700				LOADAC(CDR Z,M2+1,N2+1,M,VPR);
13800	
13900	COMPLIS(Z,M,K,VPR) ←
14000		IF NULL Z THEN NIL
14100		ELSE IF CAAR Z = 4 THEN APPEND(
14200				COMPEXP(CDAR Z,M,VPR),
14300				'((PUSH P 1)),
14400				COMPLIS(CDR Z,M-1,K+1,VPR))
14500		ELSE IF CAAR Z = 5 THEN APPEND(
14600				COMPEXP(CDAR Z,M,VPR),
14700				IF K=1 THEN NIL 
14800				ELSE LIST LIST('MOVE ,K,1))
14900		ELSE COMPLIS(CDR Z,M,K+1,VPR);
15000	
15100	CLASSIFY U ← CLASS2(CLASS1(U,NIL),NIL,T);
15200	
15300	CLASS1(U,V) ← IF NULL U THEN V
15400		ELSE IF ATOM CAR U THEN
15430			(IF CAR U = 'NIL OR CAR U = 'T OR NUMBERP CAR U THEN
15460				CLASS1(CDR U, (0 . CAR U).V)
15490				ELSE CLASS1(CDR U, (1 . CAR U).V))
15500		ELSE IF CAAR U = 'QUOTE THEN CLASS1(CDR U,(2 . CAR U).V)
15600		ELSE IF CCCHAIN CAR U THEN CLASS1(CDR U,(3 . CAR U).V)
15700		ELSE CLASS1(CDR U,(4 . CAR U).V);
15800	
15900	CLASS2(U,V,FLG) ← IF NULL U THEN V
16000			ELSE IF FLG AND (CAAR U = 4) THEN
16100					CLASS2(CDR U,(5 . CDAR U).V,NIL)
16200			ELSE CLASS2(CDR U,CAR U . V,FLG);
16300	
16400	MKJRST L ← LIST LIST('JRST ,0,L);
16500	
16600	COMBOOL(P,M,L,FLG,VPR) ←
16700		IF P EQ 'T THEN (IF FLG THEN MKJRST L ELSE NIL)
16720		ELSE IF ATOM P THEN APPEND(
16740					COMPEXP(P, M, VPR),
16760					LIST LIST (IF FLG THEN 'JUMPN
16780							ELSE 'JUMPE ,1,L))
16800		ELSE IF CAR P EQ 'EQ THEN APPEND(
16900				COMPLISA(CDR P,M,VPR),
17000				IF FLG THEN '((CAMN 1 2)) ELSE '((CAME 1 2)),
17100				MKJRST L)
17200		ELSE IF CAR P EQ 'AND THEN
17300			(IF NOT FLG THEN COMPANDOR(CDR P,M,L,NIL,VPR)
17400			ELSE (LAMBDA L1; APPEND(
17500				COMPANDOR1(CDR P,M,L1,L,NIL,VPR),
17600					LIST L1))
17700				GENSYM1())
17800		ELSE IF CAR P EQ 'OR THEN
17900			(IF FLG THEN COMPANDOR(CDR P,M,L,T,VPR)
18000			ELSE (LAMBDA L1; APPEND(
18100					COMPANDOR1(CDR P,M,L1,L,T,VPR),
18200					LIST L1))
18300				GENSYM1())
18400		ELSE IF CAR P EQ 'NOT THEN
18500			COMBOOL(CADR P,M,L,NOT FLG,VPR)
18600		ELSE IF CAR P EQ 'NULL THEN APPEND(
18700					COMPEXP(CADR P,M,VPR),
18800					LIST LIST(IF FLG THEN 'JUMPE
18900							ELSE 'JUMPN ,1,L))
19000		ELSE                    APPEND(
19100					COMPEXP(P,M,VPR),
19200					LIST LIST(IF FLG THEN 'JUMPN
19300							ELSE 'JUMPE ,1,L));
19400	
19500	COMPANDOR(U,M,L,FLG,VPR) ← IF NULL U THEN NIL
19600		ELSE APPEND(COMBOOL(CAR U,M,L,FLG,VPR),
19700				COMPANDOR(CDR U,M,L,FLG,VPR));
19800	
19900	COMPANDOR1(U,M,L,L2,FLG,VPR) ← IF NULL U THEN MKJRST L2
20000		ELSE IF NULL CDR U THEN COMBOOL(CAR U,M,L2,NOT FLG,VPR)
20100		ELSE APPEND(COMBOOL(CAR U,M,L,FLG,VPR),
20200				COMPANDOR1(CDR U,M,L,L2,FLG,VPR));
20300	
20400	
20600	
20700	
20800	GENSYM1() ← LIST('LABEL,GENSYM());
20900	
21000	FLAT(U,S) ← IF ATOM CAR U THEN U.S ELSE FLAT(CAR U,FLAT(CDR U,S));